package ar.edu.utn.frgp.labtec.dao;

import java.util.ArrayList;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import com.mysql.jdbc.StringUtils;
import ar.edu.utn.frgp.labtec.constants.DBParametersConstants;
import ar.edu.utn.frgp.labtec.entities.Cliente;
import ar.edu.utn.frgp.labtec.entities.EstadoEnum;


public class ClienteDao extends DefaultGenericDao implements GenericDao<Cliente>{

	public void create(Cliente obj) {
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		session.save(obj);
	}

	public void update(Cliente obj) {
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		session.update(obj);
	}

	public void delete(Cliente obj) {
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		obj.setEstado(EstadoEnum.I);
		session.update(obj);
	}

	public Cliente getCliente(Integer codCliente){
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		Cliente cliente = (Cliente) session.get(Cliente.class, codCliente);
		return cliente;
	}

	public List<Cliente> getRegistro(Integer codCliente) {
		List<Cliente> resultList = getAll();
		List<Cliente> registro = new ArrayList<Cliente>();
		if(codCliente == null){
			Integer size = resultList.size();
			registro.add(resultList.get(size-1));
		}else {
			registro.add(getCliente(codCliente));
		}
		return registro;
	}
	
	/**
	 * Valida si existe un cliente ya registrado y habilitado con el mismo CUIT o razón social
	 * @param cliente el cliente a validar
	 * @return true si ya existe un cliente registrado
	 */
	@SuppressWarnings("unchecked")
	public Boolean validarExistenciaCliente(Cliente cliente) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		Criteria criteria = session.createCriteria(Cliente.class);
		criteria.add(
				Restrictions.eq(DBParametersConstants.ESTADO, EstadoEnum.H))
				.add(Restrictions.disjunction()
						.add(Restrictions.ilike(DBParametersConstants.CUIT_CLIENTE,
								cliente.getCuit()))
						.add(Restrictions.ilike(DBParametersConstants.RAZON_SOCIAL_CLIENTE, cliente.getRazonSocial())));
		List<Cliente> resultList = (List<Cliente>) criteria.list();

		return (resultList != null && !resultList.isEmpty());
	}
	
	@SuppressWarnings("unchecked")
	public List<Cliente> getAll() {
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();

		return (List<Cliente>) session.createCriteria(Cliente.class)
				.add(Restrictions.eq(DBParametersConstants.ESTADO, EstadoEnum.H))
				.list();

	}

	@SuppressWarnings("unchecked")
	public List<Cliente> getClienteFiltrados(String razonSocial, String cuit, String responsable) {
		
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession(); 
		Criteria criteria = session.createCriteria(Cliente.class).add(Restrictions.eq(DBParametersConstants.ESTADO, EstadoEnum.H));

		if(!StringUtils.isNullOrEmpty(razonSocial)){
			criteria.add(Restrictions.ilike(DBParametersConstants.RAZON_SOCIAL_CLIENTE, razonSocial));
		}
		if(!StringUtils.isNullOrEmpty(cuit)){
			criteria.add(Restrictions.eq(DBParametersConstants.CUIT_CLIENTE, cuit));
		}
		if(!StringUtils.isNullOrEmpty(responsable)){
			criteria.add(Restrictions.ilike(DBParametersConstants.RESPONSABLE_CLIENTE, responsable));
		}
		
		return (List<Cliente>) criteria.list();

	}

	public Cliente getClienteModificar(String razonSocial, String cuit, String responsable) {
		Cliente cliente = new Cliente();
		List<Cliente> clienteMod = getClienteFiltrados(razonSocial, cuit, responsable);
		if(clienteMod != null)
			cliente = createObject(clienteMod);
		return cliente;
	}

	private Cliente createObject(List<Cliente> clienteMod) {
		Cliente cliente = new Cliente();
		cliente.setRazonSocial(clienteMod.get(0).getRazonSocial());
		cliente.setCuit(clienteMod.get(0).getCuit());
		cliente.setResponsable(clienteMod.get(0).getResponsable());
		cliente.setDomicilio(clienteMod.get(0).getDomicilio());
		cliente.setLocalidad(clienteMod.get(0).getLocalidad());
		cliente.setCodigoPostal(clienteMod.get(0).getCodigoPostal());
		cliente.setProvincia(clienteMod.get(0).getProvincia());
		cliente.setTelefono(clienteMod.get(0).getTelefono());
		cliente.setFax(clienteMod.get(0).getFax());
		cliente.setEmail(clienteMod.get(0).getEmail());
		cliente.setEstado(clienteMod.get(0).getEstado());
		cliente.setCodCliente(clienteMod.get(0).getCodCliente());
		return cliente;
	}

}
